#include "commonutils.h"
#include <QPainter>
#include <QFile>
#include <QWidget>
#include <QApplication>
#include <QSettings>

/**
 * @brief CommonUtils 类的默认构造函数
 * 目前该构造函数为空，没有执行任何特殊操作
 */
CommonUtils::CommonUtils()
{
}

/**
 * @brief 获取圆形头像
 * 该函数通过给定的源图片和遮罩图片，生成一个圆形的头像图片
 * @param src 源图片，将被处理成圆形的原始图片
 * @param mask 遮罩图片，用于定义圆形的形状
 * @param masksize 遮罩图片的尺寸，如果为 (0, 0) 则使用遮罩图片的原始尺寸
 * @return 返回处理后的圆形头像图片
 */
QPixmap CommonUtils::getRoundImage(const QPixmap &src, QPixmap &mask, QSize masksize)
{
    // 检查传入的遮罩尺寸是否为 (0, 0)
    if (masksize == QSize(0, 0))
    {
        // 如果为 (0, 0)，则使用遮罩图片的原始尺寸
        masksize = mask.size();
    }
    else
    {
        // 否则，将遮罩图片缩放至指定尺寸，保持宽高比并使用平滑变换
        mask = mask.scaled(masksize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
    }

    // 创建一个新的 QImage 对象，用于存储处理后的图片，使用预乘 ARGB32 格式
    QImage resultImage(masksize, QImage::Format_ARGB32_Premultiplied);
    // 创建一个 QPainter 对象，用于在 resultImage 上进行绘图操作
    QPainter painter(&resultImage);
    // 设置绘图的合成模式为 Source，即完全覆盖目标区域
    painter.setCompositionMode(QPainter::CompositionMode_Source);
    // 用透明颜色填充 resultImage 的整个矩形区域
    painter.fillRect(resultImage.rect(), Qt::transparent);
    // 设置绘图的合成模式为 SourceOver，即新绘制的内容将覆盖在原有内容之上
    painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
    // 在 (0, 0) 位置绘制遮罩图片
    painter.drawPixmap(0, 0, mask);
    // 设置绘图的合成模式为 SourceIn，即新绘制的内容只在与原有内容重叠的部分显示
    painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
    // 将源图片缩放至遮罩尺寸，保持宽高比并使用平滑变换，然后在 (0, 0) 位置绘制
    painter.drawPixmap(0, 0, src.scaled(masksize, Qt::KeepAspectRatio, Qt::SmoothTransformation));
    // 结束绘图操作，释放绘图资源
    painter.end();
    // 将处理后的 QImage 对象转换为 QPixmap 对象并返回
    return QPixmap::fromImage(resultImage);
}

/**
 * @brief 加载样式表
 * 该函数从资源文件中加载指定名称的样式表，并应用到指定的窗口部件上
 * @param widget 要应用样式表的窗口部件
 * @param sheetName 样式表文件的名称，不包含路径和扩展名
 */
void CommonUtils::loadStyleSheet(QWidget* widget, const QString &sheetName)
{
    // 创建一个 QFile 对象，用于打开指定的样式表文件
    QFile file(":/Resources/QSS/" + sheetName + ".css");
    // 以只读模式打开文件
    file.open(QFile::ReadOnly);
    // 检查文件是否成功打开
    if (file.isOpen())
    {
        // 清空窗口部件原有的样式表
        widget->setStyleSheet("");
        // 读取文件的全部内容，并将其转换为 QString 类型
        QString qsstyleSheet = QLatin1String(file.readAll());
        // 将新的样式表应用到窗口部件上
        widget->setStyleSheet(qsstyleSheet);
    }
    // 关闭文件
    file.close();
}

/**
 * @brief 设置默认皮肤颜色
 * 该函数将指定的颜色保存到配置文件中，作为默认皮肤颜色
 * @param color 要设置的默认皮肤颜色
 */
void CommonUtils::setDefaultSkinColor(const QColor &color)
{
    // 构建配置文件的路径，将应用程序的目录路径和配置文件名拼接起来
    const QString && path = QApplication::applicationDirPath() + "/" + QString("tradeprintinfo.ini");
    // 创建一个 QSettings 对象，用于读写指定路径的 INI 格式配置文件
    QSettings settings(path, QSettings::IniFormat);
    // 将颜色的红色分量保存到配置文件的 DefaultSkin 组下的 red 键中
    settings.setValue("DefaultSkin/red", color.red());
    // 将颜色的绿色分量保存到配置文件的 DefaultSkin 组下的 green 键中
    settings.setValue("DefaultSkin/green", color.green());
    // 将颜色的蓝色分量保存到配置文件的 DefaultSkin 组下的 blue 键中
    settings.setValue("DefaultSkin/blue", color.blue());
}

/**
 * @brief 获取默认皮肤颜色
 * 该函数从配置文件中读取默认皮肤颜色，如果配置文件不存在，则设置默认颜色为天蓝色
 * @return 返回读取到的默认皮肤颜色
 */
QColor CommonUtils::getDefaultSkinColor()
{
    // 创建一个 QColor 对象，用于存储读取到的颜色
    QColor color;
    // 构建配置文件的路径，将应用程序的目录路径和配置文件名拼接起来
    const QString && path = QApplication::applicationDirPath() + "/" + QString("tradeprintinfo.ini");
    // 输出调试信息，显示配置文件的路径
    // 检查配置文件是否存在
    if (!QFile::exists(path))
    {
        // 如果文件不存在，设置默认颜色为天蓝色 (22, 154, 218)
        setDefaultSkinColor(QColor(22, 154, 218));
    }

    // 创建一个 QSettings 对象，用于读写指定路径的 INI 格式配置文件
    QSettings settings(path, QSettings::IniFormat);
    // 从配置文件中读取红色分量，并设置到 color 对象中
    color.setRed(settings.value("DefaultSkin/red").toInt());
    // 从配置文件中读取绿色分量，并设置到 color 对象中
    color.setGreen(settings.value("DefaultSkin/green").toInt());
    // 从配置文件中读取蓝色分量，并设置到 color 对象中
    color.setBlue(settings.value("DefaultSkin/blue").toInt());
   
    // 返回读取到的颜色
    return color;
}
